/**
 ******************************************************************************
 * @file touch_screen.h
 * @author GX (2524913364@qq.com)
 * @brief   触摸屏文件
 * @version 1.0.0 
 * @date 2022-07-04
 * 
 * @copyright Copyright (c) 2022
 * 
 ******************************************************************************
 *----------------------------------------------------------------------------*
 *  Remark         : Description                                              *
 *----------------------------------------------------------------------------*
 *  Change History :                                                          *
 *  <Date>     | <Version> | <Author>       | <Description>                   *
 *----------------------------------------------------------------------------*
 *  2022-07-04 | 1.0.0     | GX             | Create file                     *
 *----------------------------------------------------------------------------*
 *                                                                            *
 ******************************************************************************
 */


/*----------------------------- start of file -------------------------------*/
#ifndef _TOUCHLCD_H
#define _TOUCHLCD_H

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <linux/input.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdbool.h>
#include <string.h>


// #define TOUCH_DEBUG	/* 不输出调试信息就取消注释 */

#define TOUCH_PATH  "/dev/input/event0"



/* 划屏动作 */
typedef enum 
{
	TC_NONE,
	TC_LEFT,
	TC_RIGHT,
	TC_UP,
	TC_DOWN
}TOUCH_SLID;

/* 状态机 */
/* 拖动的判断包含在按下，用户在使用的时候可以根据已定义好的
	结构体变量 touch 成员中的 time_last-time > 0.2 是否
	成立来判断但前的按下是否为长按或者拖动 */
typedef enum
{
	STATE_NOT_PRESSED,			/* 无操作 */
	STATE_PRESSED,					/* 按下 */
	STATE_RELEASE,					/* 释放 */
	STATE_SIN_OR_DOU,				/* 判断单击还是双击 */
	STATE_SINGLE_CLICK,			/* 单击 */
	STATE_DOUBLE_CLICK,			/* 双击 */
	STATE_SLIDING,				  /* 滑屏 */
	STATE_DTAGING						/* 拖动 */
}TOUCH_STATE;

typedef struct TOUCH
{
	bool response;					/* 是否有被响应 */
	int x_per,y_per;				/* 上一轮的坐标，用来判断双击 */
	int x_last,y_last;			/* 最后一次的坐标 */
	int x,y;								/* 第一次的坐标 */
	float time_per;					/* 上一轮的时间 */
	float time_last;/* 最后一次的时间 */
	float time;		/* 第一次的时间 */
	TOUCH_SLID motion;			/* 划屏动作 */
	TOUCH_STATE	state;			/* 状态机的状态 */
	
}TOUCH;

/* 这两个变量其实是一样的，历史遗留问题不想使用名字 'p' 
	但直接改又要在各个使用到 p 的函数修改名字很麻烦 */
extern TOUCH p;				
extern TOUCH touch;		
extern long tc_time_cur;

void test_fun(void);
void get_tcState(TOUCH *tc);
void response_over(void);
pthread_t InitTouch_pthread(void);
void *TouchGet(void *arg);
void *TouchSlide(void *arg);

void Init_tcState(void);
void Renew_tcState(void);
void *Touch_stateMachine(void *arg);


#endif  /* _TOUCHLCD_H */
 

/*------------------------------ end of file --------------------------------*/

